package org.example.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * String工具类
 */
@Slf4j
public class StringUtil {

    /**
     * 0-9的正则表达式
     **/
    public static final Pattern PATTERN = Pattern.compile("^[-\\+]?[\\d]*$");

    /**
     * @return true为包含，false为不包含
     * @Description 判断是否含有特殊字符
     * @params str
     * @author 林杏
     * @Date 2018/6/22
     * @Modified by:
     */
    public static boolean isSpecialChar(String str) {
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？\\\\]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 数字前置补0
     *
     * @param sourceValue 原数据
     * @param length      补0后的数据长度
     * @return
     */
    public static String fillWithZero(Object sourceValue, int length) {
        // 原数据为null或不是数字格式时返回null
        if (sourceValue == null || StringUtils.isBlank(sourceValue.toString())
                || !StringUtils.isNumeric(sourceValue.toString())) {
            return null;
        }
        // 填充0位数要大于原数据位数
        if (length <= 0 || length <= sourceValue.toString().length()) {
            return sourceValue.toString();
        }

        // 开始构建格式化0的位数
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(0);
        }
        try {
            return new DecimalFormat(sb.toString()).format(Long.valueOf(sourceValue.toString()));
        } catch (Exception e) {
            log.error("fillWithZero()_失败，出现异常，返回原数据  e：{},sourceValue:{}", e, sourceValue);
        }

        return sourceValue.toString();
    }

    /**
     * 判断是否为数字
     *
     * @param str String对象
     * @return boolean :true 是；false : 不是。
     * @author code_chen
     */
    public static boolean isNumeric(String str) {
        try {
            new BigDecimal(str);
            return true;
        } catch (Exception e) {
            return false;
        }

    }

    /**
     * 判断字符串是否为整数
     *
     * @param str String对象
     * @return boolean :true 是；false : 不是。
     * @author chenpeng
     */
    public static boolean isInteger(String str) {
        return PATTERN.matcher(str).matches();
    }


    /**
     * * 判断一个对象数组是否非空
     *
     * @param objects 要判断的对象数组
     * @return true：非空 false：空
     */
    public static boolean isNotEmpty(Object[] objects)
    {
        return !isEmpty(objects);
    }

    /**
     * * 判断一个对象数组是否为空
     *
     * @param objects 要判断的对象数组
     ** @return true：为空 false：非空
     */
    public static boolean isEmpty(Object[] objects)
    {
        return isNull(objects) || (objects.length == 0);
    }

    /**
     * * 判断一个对象是否为空
     *
     * @param object Object
     * @return true：为空 false：非空
     */
    public static boolean isNull(Object object)
    {
        return object == null;
    }


    /**
     * 根据现金原价计算折扣
     *
     * @param price    现价 原价
     *                 四舍五入 保留一位小数
     * @param oldPrice
     * @return
     */
    public static BigDecimal discountCalculate(BigDecimal price, BigDecimal oldPrice) {
        if(null==price||null==oldPrice){
            return new BigDecimal(0);
        }

        //现价除以原价乘以10
        double discount = ((price.doubleValue() / oldPrice.doubleValue()) * 10);
        if(Double.isNaN(discount)){
            return new BigDecimal(0);
        }
        // 四舍五入保留一位小数
        BigDecimal discountBig=new BigDecimal(discount).setScale(1, BigDecimal.ROUND_HALF_UP);
        //判断第一位小数是否为0，为0就只取整数，不为0就不变
        if(StringUtils.contains("0",discountBig.toString().split("\\.")[1])){
            return new BigDecimal(discountBig.toString().split("\\.")[0]);
        }else{
            return discountBig;
        }
    }

    /**
     * 保留一位小数
     * 四舍五入
     *
     * @param val
     * @return
     */
    public static BigDecimal multiply(BigDecimal val) {
        if(null==val){
            val=new BigDecimal(0.00);
        }
        // 四舍五入保留一位小数
        val=val.setScale(1, BigDecimal.ROUND_HALF_UP);
        //判断第一位小数是否为0，为0就只取整数，不为0就不变
        if(StringUtils.contains("0",val.toString().split("\\.")[1])){
            return new BigDecimal(val.toString().split("\\.")[0]);
        }else{
            return val;
        }
    }

    /**
     * 保留二位小数
     *
     * @param val
     * @return
     */
    public static String multiplyTwo(BigDecimal val) {
        if(null==val){
            val=new BigDecimal(0);
        }
        // 保留二位小数四舍五入
        return val.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }



}
